/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package GUI;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JPanel;

/**
 *
 * @author petiano
 */
public class Grid extends JPanel {

    private List<Point> obstaculos;
    static private int dimensoes = 50;
    static private int alcanceDoInfra = 100;
    static private int alcanceDoSonar = 200;
    private Point localizacaoDoRobo;
    private int deslocamento;

    public Grid() {

        this.setVisible(true);
        obstaculos = new ArrayList<Point>();
    }

    /** Adiciona a coordenada do obstaculo numa lista,
     *  caso o obstaculo ja exista, ele sera apagado;
     */
    public void desenhaObstaculo(Point p) {

        Point aux = this.normalizarCoordenada(p);

        if (obstaculos.contains(aux)) {
            obstaculos.remove(aux);
        } else {
            obstaculos.add(aux);
        }
        repaint();
    }

    private void desenhaSensores(Graphics g) {

        int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
        double angulo1 = 157.5, angulo2 = -157.5;
        double regulaAngulo = 16;

        switch (deslocamento) {
            case 37:    // Esquerda          
                // Desenhando infravermelho;
                x1 = localizacaoDoRobo.x;
                y1 = localizacaoDoRobo.y + dimensoes / 2;
                x2 = x1 - alcanceDoInfra;
                y2 = y1;
                // Desenhando sonar;
                angulo1 = 157.5;
                angulo2 = -157.5;
                break;
            case 38:    // Cima
                // Desenhando infravermelho;
                x1 = localizacaoDoRobo.x + dimensoes / 2;
                y1 = localizacaoDoRobo.y;
                x2 = x1;
                y2 = y1 - alcanceDoInfra;
                // Desenhando sonar;
                angulo1 = -112.5;
                angulo2 = -67.5;
                break;
            case 39:    // Direita
                // Desenhando infravermelho;
                x1 = localizacaoDoRobo.x + dimensoes;
                y1 = localizacaoDoRobo.y + dimensoes / 2;
                x2 = x1 + alcanceDoInfra;
                y2 = y1;
                // Desenhando sonar;
                angulo1 = -22.5;
                angulo2 = 22.5;
                break;
            case 40:     // Baixo
                // Desenhando infravermelho;
                x1 = localizacaoDoRobo.x + dimensoes / 2;
                y1 = localizacaoDoRobo.y + dimensoes;
                x2 = x1;
                y2 = y1 + alcanceDoInfra;
                // Desenhando sonar;
                angulo1 = 67.5;
                angulo2 = 112.5;
                break;
        }

        int x3 = (int) (alcanceDoSonar * Math.cos(Math.toRadians(angulo1)));
        int y3 = (int) (alcanceDoSonar * Math.sin(Math.toRadians(angulo1)));
        int x4 = (int) (alcanceDoSonar * Math.cos(Math.toRadians(angulo2)));
        int y4 = (int) (alcanceDoSonar * Math.sin(Math.toRadians(angulo2)));

        // Desenhando infravermelho;
        g.setColor(Color.RED);
        g.drawLine(x1, y1, x2, y2);
        // Desenhando sonar;
        g.setColor(Color.BLUE);
        g.drawLine(x1, y1, x1+x3, y1+y3);
        g.drawLine(x1, y1, x1+x4, y1+y4);
        g.drawLine(x1+x3, y1+y3, x1+x4, y1+y4);
        repaint();
    }

    public Point getLocalizacaoDoRobo() {
        return localizacaoDoRobo;
    }

    public void setLocalizacaoDoRobo(Point localizacaoDoRobo) {
        this.localizacaoDoRobo = localizacaoDoRobo;
    }

    public List<Point> getObstaculos() {
        return obstaculos;
    }

    public void setObstaculos(List<Point> obstaculos) {
        this.obstaculos = obstaculos;
    }

    public int getDeslocamento() {
        return deslocamento;
    }

    public void setDeslocamento(int deslocamento) {
        this.deslocamento = deslocamento;
    }

    public Point normalizarCoordenada(Point click) {

        int xAux = click.x % dimensoes;
        int yAux = click.y % dimensoes;

        int novoX = click.x - xAux + 1;
        int novoY = click.y - yAux + 1;

        return new Point(novoX, novoY);
    }

    // Desenha grade
    public void desenhaGrade(Graphics g) {

        g.setColor(Color.LIGHT_GRAY);
        // Desenha linhas...
        for (int i = 1; i <= 2000; i += dimensoes) {
            g.drawLine(1, i, 2000, i);
        }
        // Desenha colunas...
        for (int i = 1; i <= 2000; i += dimensoes) {
            g.drawLine(i, 1, i, 2000);
        }
    }

    public void desenhaObstaculos(Graphics g) {

        g.setColor(Color.ORANGE);
        for (int i = 0; i < obstaculos.size(); i++) {
            g.fillRect(obstaculos.get(i).x, obstaculos.get(i).y, dimensoes, dimensoes);
        }
    }

    @Override
    /**
     * Este metodo desenha obstaculos para o robo na tela do JPanel;
     */
    public void paint(Graphics g) {

        super.paint(g);
        this.desenhaGrade(g);
        this.desenhaSensores(g);
        this.desenhaObstaculos(g);
    }
}
